Skip to main content

第 1 章:認識 Terraform 組態檔

組態檔範例

 組態檔範例 main.tf 
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "3.5.0"
}
}
}

provider "aws" {
profile = "default"
region = "ap-northeast-1"
}

resource "aws_instance" "example" {
ami = "ami-0461b11e2fad8c14a"
instance_type = "t2.micro"
}
  1. 第一個 terraform 區塊寫著需要的工具來源跟版本
  2. 第二個 provider 區塊寫著供應商 aws 相關的設定
  3. 第三個 resoucre 區塊寫著伺服器相關的設定

組態語言 (Configuration Language)

Terrform 採用名為 HCL (HashiCorp Configuration Language) 的組態語言來描述基礎架構。

HCL 是一種宣告式的語言,讓你直接寫下期望的基礎架構,而不是寫下過程的每一個步驟。

Terrform 組態語言的讓你更容易的宣告資源 (Resource),更可以把一系列的資源包裝成一個模組 (Module),藉此設計更龐大的架構。

我們來看下面這個範例,進一步了解 Terraform 的語法:

resource "aws_instance" "example" {
ami = "ami-0461b11e2fad8c14a"
instance_type = "t2.micro"
}

<BLOCK TYPE> "<RESOURCE TYPE>" "<LOCAL NAME>" {
# Block body
<ARGUMENT NAME> = <ARGUMENT VALUE> # Argument
}

區塊 Block

  • 區塊的開頭是區塊類型 (Block Type),後面接著區塊標籤 (Block Label),隨著區塊種類的不同,標籤的數量會有差異。
  • 這邊以 resource 的區塊為例,後面依續接著資源類型 (Resouce Type) 跟區域名稱 (Local Name) 兩個標籤
  • 資源類型 (Resouce Type): 要從供應商提供的服務清單中尋找,不同的供應商有著不同的資源類型
  • 區域名稱 (Local Name): 就是自己定義的名稱,有效範圍只在這個模組內
  • 區塊的內容用大括號 { } 包起來,裡面有多個引數 (Argument)

引數 (Argument)

  • 引數的格式是以名稱開始,接著一個等號,等號後面放值。
  • 在不同資源類型中,有各自的必要 (Required) 引數,一定要寫好這需必要引數,整個組態檔才能夠正常使用

檔案編碼

  • 首先,Terraform 的檔案必須是 UTF-8 編碼。

建立命名

  • 使用 _ 底線,小寫的英文字母,以及數字來命名資源。
  • 使用單數名詞命名
  • 避免型態名稱出現在命名中
  • 好: resource "aws_route_table" "public"
  • 壞: resource "aws_route_table" "public_route_table"

註解

  • 單行註解以 # 字元開始
  • 多行註解用 /* 跟 / 符號包住

排版

  • 自動格式化程式碼工具 terraform fmt 會自動處理排版風格:
  • 換行字元: 使用 Linux 格式 (LF)。
  • 縮排: 使用兩個空白字元縮排。
  • 等號對齊: 出現連續多行有使用等號的組態時,會對齊等號。
  • 區塊內的引數順序:
    • 同時出現引數跟區塊時,引數在前,區塊在後,中間間隔一行。
    • 不同引數群組使用空行分隔。
    • 同時出現引數 (arguments) 跟元引數 (meta-arguments) 時,最先放元引數,再放其他的引數,區塊型態的元引數在最後。
    • 範例:
  resource "aws_instance" "example" {
count = 2# 元引數最先

ami = "abc123"
instance_type = "t2.micro"

network_interface {
# ...
}

lifecycle {# 元引數區塊最後create_before_destroy = true
}
}

  • 最外層的區塊之間都要間隔一個空行。
  • 還有一些詳細的條件,就交給 terraform fmt